package org.example.day02;

import java.util.Scanner;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO +
 * <span>小华和小为是很要好的朋友，他们约定周末一起吃饭。通过手机交流，他们在地图上选择了多个聚餐地点（由于自然地形等原因，部分聚餐地点不可达），求小华和小为都能到达的聚餐地点有多少个？</span>
 *
 * 小华和小为是很要好的朋友，他们约定周末一起吃饭。通过手机交流，他们在地图上选择了多个聚餐地点
 * （由于自然地形等原因，部分聚餐地点不可达），求小华和小为都能到达的聚餐地点有多少个？
 * @date 2024/3/11 15:22
 */
public class test039{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        int[][] grid = new int[m][n];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                grid[i][j] = scanner.nextInt();
            }
        }

        int result = countCommonMeetingSpots(m, n, grid);
        System.out.println(result);
    }

    public static void dfs(int row, int col, int m, int n, int[][] grid, boolean[][] visited) {
        if (row < 0 || row >= m || col < 0 || col >= n || visited[row][col] || grid[row][col] == 1) {
            return;
        }

        visited[row][col] = true;

        dfs(row - 1, col, m, n, grid, visited); // 上方位置
        dfs(row + 1, col, m, n, grid, visited); // 下方位置
        dfs(row, col - 1, m, n, grid, visited); // 左方位置
        dfs(row, col + 1, m, n, grid, visited); // 右方位置
    }

    public static int countCommonMeetingSpots(int m, int n, int[][] grid) {
        boolean[][] visitedHua = new boolean[m][n];  // 记录小华能到达的位置
        boolean[][] visitedWei = new boolean[m][n];  // 记录小为能到达的位置
        int[] huaPos = new int[2];
        int[] weiPos = new int[2];
        boolean foundHua = false, foundWei = false;

        // 寻找小华和小为的位置
        for (int i = 0; i < m && (!foundHua || !foundWei); i++) {
            for (int j = 0; j < n && (!foundHua || !foundWei); j++) {
                if (grid[i][j] == 2) {
                    if (!foundHua) {
                        huaPos[0] = i;
                        huaPos[1] = j;
                        foundHua = true;
                    } else {
                        weiPos[0] = i;
                        weiPos[1] = j;
                        foundWei = true;
                    }
                }
            }
        }

        // 分别从小华和小为的位置出发进行深度优先搜索
        dfs(huaPos[0], huaPos[1], m, n, grid, visitedHua);
        dfs(weiPos[0], weiPos[1], m, n, grid, visitedWei);

        // 计算共同可以到达的聚餐地点数量
        int count = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 3 && visitedHua[i][j] && visitedWei[i][j]) {
                    count++;
                }
            }
        }

        return count;
    }
}
